﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.IO;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Media;
using Microsoft.Devices.Radio;
using System.IO.IsolatedStorage;
using Microsoft.Phone.Scheduler;

namespace WakeApp
{
    public partial class Domanda : PhoneApplicationPage
    {
        //storage dell'applicazione
        private static IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings;

        //nome degli allarmi nello scheduler
        private string nextAlarmName = "WakeUpAlarm";

        public Domanda()
        {
            InitializeComponent();
        }

        private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
        {
            NavigationService.RemoveBackEntry();

            CreaDomanda();
            
            Stream stream = TitleContainer.OpenStream("audio/elisa.wav");
            SoundEffect effect = SoundEffect.FromStream(stream);
            FrameworkDispatcher.Update();

            effect.Play();

        }

        private void CreaDomanda()
        {
            // calcolo i numeri random
            Random rx = new Random();
            Random ry = new Random();
            Random rz = new Random();

            int x = (rx.Next(100) * DateTime.Now.Second) % 11;//da 0 a 10
            int y = (ry.Next(100) * DateTime.Now.Second) % 21;//da 0 a 20
            int z = ((rz.Next(100) * DateTime.Now.Second) % 10) +1;//da 1 a 10

            // scrivo la domanda
            string quest = "( "+x.ToString()+" + "+y.ToString()+" ) * "+z.ToString()+" = ?";
            Question.Text = quest;

            // trovo il risultato
            int ris = (x + y) * z;

            //id random del bottone corretto
            Random br = new Random();
            int b = ((br.Next(100)* DateTime.Now.Second)%4)+1;//da 1 a 4

            switch (b) { 
                case 1:
                    B1.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_TapOK);
                    B1.Content = ris.ToString();
                    B2.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_Tap_None);
                    B2.Content = (ris + new Random().Next(6,9)).ToString();
                    B3.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_Tap_None);
                    B3.Content = (ris - new Random().Next(1, 5)).ToString();
                    B4.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_Tap_None);
                    B4.Content = (ris + new Random().Next(1, 5)).ToString();
                    break;
                case 2:
                    B1.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_Tap_None);
                    B1.Content = (ris - new Random().Next(5, 6)).ToString();
                    B2.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_TapOK);
                    B2.Content = ris.ToString();
                    B3.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_Tap_None);
                    B3.Content = (ris - new Random().Next(1, 4)).ToString();
                    B4.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_Tap_None);
                    B4.Content = (ris + new Random().Next(4, 8)).ToString();
                    break;
                case 3:
                    B1.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_Tap_None);
                    B1.Content = (ris + new Random().Next(1, 3)).ToString();
                    B2.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_Tap_None);
                    B2.Content = (ris + new Random().Next(4, 7)).ToString();
                    B3.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_TapOK);
                    B3.Content = ris.ToString();
                    B4.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_Tap_None);
                    B4.Content = (ris + new Random().Next(8, 10)).ToString();
                    break;
                case 4:
                    B1.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_Tap_None);
                    B1.Content = (ris - new Random().Next(4, 5)).ToString();
                    B2.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_Tap_None);
                    B2.Content = (ris - new Random().Next(6, 10)).ToString();
                    B3.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_Tap_None);
                    B3.Content = (ris - new Random().Next(1, 3)).ToString();
                    B4.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(Button_TapOK);
                    B4.Content = ris.ToString();
                    break;
            }
 
        }

        private void Button_TapOK(object sender, System.Windows.Input.GestureEventArgs e)
        {
            MessageBox.Show("gg man, u r leave to go");
            
            ModifyAlarm();//calcolo nuova sveglia

            NavigationService.GoBack();//esco dall'applicazione
        }

        private void Button_Tap_None(object sender, System.Windows.Input.GestureEventArgs e)
        {
            MessageBox.Show("seriously u fail?");
        }

        private int indexOfWeek()
        {
            string s = DateTime.Now.DayOfWeek.ToString();
            switch (s)
            {
                case "Monday": return 0;
                case "Tuesday": return 1;
                case "Wednesday": return 2;
                case "Thursday": return 3;
                case "Friday": return 4;
                case "Saturday": return 5;
                case "Sunday": return 6;

                default: return 0;
            }
        }

        private DateTime fromStringToDateTime(string s)
        {
            string[] ris = s.Split(':');
            int ora = int.Parse(ris[0]);
            ris = ris[1].Split('|');
            int min = int.Parse(ris[0]);
            string settimana = ris[1];

            int indexOfToday = indexOfWeek();
            int annoAttuale = DateTime.Now.Year;
            int meseAttuale = DateTime.Now.Month;
            int giornoAttuale = DateTime.Now.Day;
            int oraAttuale = DateTime.Now.Hour;
            int minAttuale = DateTime.Now.Minute;

            bool trovato = false;

            if (settimana == "0000000")//sveglia in giornata
            {
                //controllo l'ora
                if (ora > oraAttuale || (ora == oraAttuale && min > minAttuale))//sveglia corretta
                {
                    //la sveglia è oggi
                    return new DateTime(annoAttuale, meseAttuale, giornoAttuale, ora, min, 0);
                }
                else
                {
                    //la sveglia è domani
                    DateTime temp = new DateTime(annoAttuale, meseAttuale, giornoAttuale, ora, min, 0);
                    return new DateTime(temp.Ticks + TimeSpan.TicksPerDay);
                }
            }
            else//ha almeno un 1 in settimana
            {
                if ((settimana[indexOfToday] == '1') && (ora > oraAttuale || (ora == oraAttuale && min > minAttuale)))//la sveglia è oggi
                {
                    return new DateTime(annoAttuale, meseAttuale, giornoAttuale, ora, min, 0);
                }
                else//la sveglia non è oggi
                {
                    int i = indexOfToday + 1;//parto da domani

                    while (!trovato)
                    {

                        if (settimana[i] == '1')
                        {
                            trovato = true;
                            int numDay = (((indexOfToday + i) % 7) + 1);

                            DateTime temp = new DateTime(annoAttuale, meseAttuale, giornoAttuale, ora, min, 0);
                            return new DateTime(temp.Ticks + TimeSpan.TicksPerDay * numDay);
                        }

                        if (i == indexOfToday)
                            break;

                        i = (i + 1) % 7;
                    }

                    MessageBox.Show("an unknow error has accured");//impossibile to happen
                }
            }

            return new DateTime();//impossibile to happen
        }//fromStringToDateTime

        private void ModifyAlarm()
        {
            if (appSettings.Contains("nextAlarm"))
            {
                appSettings.Remove("nextAlarm");

                //eliminare vecchie sveglie, se le trovo
                for (int i = 0; i < 20; i++)
                    if (ScheduledActionService.Find(nextAlarmName + i.ToString()) != null)//ho trovato una sveglia con questo nome
                    {
                        ScheduledActionService.Remove(nextAlarmName + i.ToString());//la rimuovo
                    }
            }

            if (appSettings.Count > 0)//esiste almeno una sveglia
            {
                DateTime min;
                string minKey = "";
                DateTime temp;

                foreach (string key in appSettings.Keys)//prendo la prima
                {
                    if (appSettings[key].ToString() == "on")
                    {
                        minKey = key;//salvo la chiave
                        break;
                    }
                }

                if (minKey != "")//almeno una a on
                {
                    min = fromStringToDateTime(minKey);

                    foreach (string key in appSettings.Keys)//mette in min la sveglia più prossima
                    {
                        if (appSettings[key].ToString() == "on")//guardo quelle attive
                        {
                            temp = fromStringToDateTime(key);

                            if (temp.Ticks < min.Ticks)
                            {
                                min = temp;//salvo il datetime
                                minKey = key;//e la chiave relativa alla sveglia
                            }
                        }
                    }

                    if (appSettings.Contains("nextAlarm"))//ho almeno un'altra sveglia dentro
                    {
                        appSettings["nextAlarm"] = min;//la sostituisco con la nuova prossima sveglia
                    }
                    else //se non c'è nulla è la prima sveglia
                    {
                        appSettings.Add("nextAlarm", min);//l'aggiungo
                    }

                    
                    //eliminare vecchie sveglie, se le trovo
                    for (int i = 0; i < 20; i++)
                        if (ScheduledActionService.Find(nextAlarmName + i.ToString()) != null)//ho trovato una sveglia con questo nome
                        {
                            ScheduledActionService.Remove(nextAlarmName + i.ToString());//la rimuovo
                        }

                    for (int i = 0; i < 20; i++)
                    {
                        DateTime supl = new DateTime(min.Ticks + (TimeSpan.TicksPerMinute * i));

                        Alarm sv = new Alarm(nextAlarmName + i.ToString());
                        sv.Content = "it's time to wake up my dear.";
                        sv.Sound = new Uri("Audio/elisa.wav", UriKind.Relative);

                        sv.BeginTime = supl;

                        ScheduledActionService.Add(sv);
                    }
                }
            }

        }//ModifyAlarm

    }
}